安装
使用k8s最麻烦的就是提供pv存储,很多情况下我们需要使用本地磁盘作为存储。
但是k8s默认不支持通过storageClass的方式自动创建以本地磁盘为存储的pv。
好在有开源的rancher/local-path-provisioner
使用方法很简单,下载yaml文件 https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.22/deploy/local-path-storage.yaml
有3处地方一般情况下需要修改:
第一,删除–debug
第二,搜索reclaimPolicy,默认值是Delete,可以改成Retain,避免误删pv造成数据丢失
第三,搜索StorageClass,增加annotations,使local-path storageclass成为默认storageclass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-path
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 默认storageclass
provisioner: rancher.io/local-path
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain
第四,修改最后面的configMap:
kind: ConfigMap
apiVersion: v1
metadata:
name: local-path-config
namespace: local-path-storage
data:
config.json: |-
{
"nodePathMap":[
{
"node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
"paths":["/opt/local-path-provisioner"]
}
]
}
setup: |-
#!/bin/sh
set -eu
mkdir -m 0777 -p "$VOL_DIR"
teardown: |-
#!/bin/sh
set -eu
rm -rf "$VOL_DIR"
helperPod.yaml: |-
apiVersion: v1
kind: Pod
metadata:
name: helper-pod
spec:
containers:
- name: helper-pod
image: busybox
imagePullPolicy: IfNotPresent
其中/opt/local-path-provisioner
就是你本地数据存储目录,根据情况自由修改。
执行kubectl apply -f local-path-storage.yaml
即可。
要使用这个动态pv时,storageClass设置为local-path
就OK了
个性化配置
我们也可以个性化配置上面的配置文件
nodePathMap
我们也可以个性化定制每个节点的存储路径,示例如下:
"nodePathMap":[
{
"node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
"paths":["/opt/local-path-provisioner"]
},
{
"node":"node-1",
"paths":["/opt/local-path-provisioner", "/data1"]
},
{
"node":"node-2",
"paths":[]
}
]
DEFAULT_PATH_FOR_NON_LISTED_NODES
表示默认存储位置,所有节点如果没有特别指定,都将使用这个路径。node-1节点指定了两个目录,在分配pv时将随机指定一个目录创建pv。
node-2没有指定任何路径,那么该节点不会被分配pv
setup
setup脚本在volume创建前调用,用于创建存储目录
teardown
teardown脚本在volume被删除时调用,用于清除数据
helperPod.yaml
helperPod.yaml是pod模板,运行一个busybox的pod,setup和teardown脚本都是在这个pod中执行
自动刷新配置
我们可以直接使用kubectl edit去修改上面的configmap,或者修改local-path-provisioner.yaml文件然后执行kubectl apply,local-path-provisioner会自动刷新配置